Most general purpose computer systems are built around a general-purpose processor, which is typically an integrated circuit operable to perform a wide variety of operations useful for executing a wide variety of software. The processor is able to perform a fixed set of instructions, which collectively are known as the instruction set for the processor. A typical instruction set includes a variety of types of instructions, including arithmetic, logic, and data instructions.
In more sophisticated computer systems, multiple processors are used, and one or more processors runs software that is operable to assign tasks to other processors or to split up a task so that it can be worked on by multiple processors at the same time. In such systems, the data being worked on is typically stored in memory that is either centralized, or is split up among the different processors working on a task.
Instructions from the instruction set of the computer's processor or processor that are chosen to perform a certain task form a software program that can be executed on the computer system. Typically, the software program is first written in a high-level language such as “C” that is easier for a programmer to understand than the processor's instruction set, and a program called a compiler converts the high-level language program code to processor-specific instructions.
In multiprocessor systems, the programmer or the compiler will usually look for tasks that can be performed in parallel, such as calculations where the data used to perform a first calculation are not dependent on the results of certain other calculations such that the first calculation and other calculations can be performed at the same time. The calculations performed at the same time are said to be performed in parallel, and can result in significantly faster execution of the program. Although some programs such as web browsers and word processors don't consume a high percentage of even a single processor's resources and don't have many operations that can be performed in parallel, other operations such as scientific simulation can often run hundreds or thousands of times faster in computers with thousands of parallel processing nodes available.
The program runs on multiple processors by passing messages between the processors, such as to share the results of calculations, to share data stored in memory, and to configure or report error conditions within the multiprocessor system. Communication between processors is an important part of the efficiency of a multiprocessor system, and becomes increasingly important as the number of processor nodes reaches into the hundreds or thousands of processors, and the processor network distance between two processors becomes large.
The speed of a processor or of a group of processors at running a given program is also dictated by the instructions the processor is able to execute, and the processor's ability to quickly access the data needed to complete execution of program instructions. Memory speed can therefore be a significant factor in computer performance, and has led to small amounts of relatively fast but expensive memory known as cache being utilized to store copies of data most frequently used while larger but slower memory holds the bulk of program instructions and other data being used by the computer system.
Efficient sharing of memory is also an important part of computer system performance, as various processors in a multiprocessor computer typically exchange data by storing and reading data to shared memory. Ensuring that the data is up-to-date is a significant challenge, as shared data can be changed by other processors, and cached data can be updated in cache and main memory at different times. For example, if a pending write to a memory location has been issued but has not yet completed when a processor reads the memory location, the outdated data might be read.
It is desirable to provide memory system that ensures the accessibility and integrity of data in a multiprocessor computer system.